package com.zingrow.web.report.service;

import java.awt.Dimension;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;

import com.zingrow.web.report.base.TableField;
import com.zingrow.web.report.response.ModuleData;

public interface IDocExportor {
    /**
     * 报告的名称字段
     */
    String RPT_NAME = "RPT_TITLE";
    /**
     * 组织名称字段
     */
    String GAROUP_NAME = "GAROUP_NAME";
    /**
     * 表格高度
     */
    final float TABLE_HEIGHT = 25F;

    /**
     * 根据数据解析后写入到PDF文档
     * 
     * @param infos
     *            一些标题注释信息等
     * @param moduleDatas
     *            排序的模块数据，包括标题等信息
     * @param svg
     *            有图表的svg字符串，根据模块信息里的标题取出，并生成图片插入word
     * @param out
     *            word的输出流对象
     * @return
     */
    IDocExportor createDoc(Map<String, String> infos, List<ModuleData> moduleDatas, Map<String, String> svg,
            OutputStream out);

    /**
     * 将文件写到流中
     * 
     * @param out
     */
    void writeToStream() throws Exception;

    /**
     * 写入表格信息
     * 
     * @param fields
     *            对表格的字段描述
     * @param dataJson
     *            数据json字符串
     * @param isPullByList
     *            是否以普通列表方式排列
     * @param rowSize
     *            行数
     */
    void writeTable(List<TableField> fields, String dataJson, boolean isPullByList, int rowSize) throws Exception;

    /**
     * 写入文字列表
     * 
     * @param fields
     *            样式描述
     * @param dataJson
     *            数据Json字符串
     */
    void writeTextList(List<TableField> fields, String dataJson) throws Exception;

    /**
     * 写入图片
     * 
     * @param inputStream
     * @param size
     * @param align
     *            显示位置，左中右，使用
     *            {@link com.zingrow.web.report.utils.WordDocExportor.Align}
     */
    void writeImage(byte[] bytes, Dimension size, Align align) throws Exception;

    /**
     * 写入标题
     * 
     * @param text
     *            需要被写入展示的标题文本
     * @param font
     *            字体和大小,使用
     *            {@link com.zingrow.web.report.utils.WordDocExportor.DocFont}
     * @param align
     *            显示位置，左中右，使用
     *            {@link com.zingrow.web.report.utils.WordDocExportor.Align}
     */
    void writeText(String text, DocFont font, Align align) throws Exception;

    void writeLine() throws Exception;

    /**
     * 内容/图/表格显示位置
     */
    enum Align {
        Right, Center, Left
    }

    enum DocFont {
        TitleDoc("Microsoft YaHei", 22, true), TitleModule("Microsoft YaHei", 12, true), Content("Microsoft YaHei", 12,
                false);
        private String font;
        private Integer size;
        private Boolean bold;

        private DocFont(String font, Integer size, Boolean bold) {
            this.font = font;
            this.size = size;
            this.bold = bold;
        }

        public String getFont() {
            return font;
        }

        public void setFont(String font) {
            this.font = font;
        }

        public Integer getSize() {
            return size;
        }

        public void setSize(Integer size) {
            this.size = size;
        }

        public Boolean getBold() {
            return bold;
        }

        public void setBold(Boolean bold) {
            this.bold = bold;
        }

    }
}
